/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package escom.ipn.modelo.dao;

import escom.ipn.modelo.dto.UsuarioIncidente;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Daniel
 */
public class UsuarioIncidenteDAO {
     public static final String SQL_INSERT =
            "INSERT INTO usuario_incidente (usuario_id, incidente_id) VALUES (?, ?)";
    public static final String SQL_SELECT =
            
            "SELECT * FROM usuario_incidente "
            + "join incidente on incidente_id=id_incidente "
            + "join CAT_ESTADOS_INCIDENTE on CAT_ESTADOS_INCIDENTE_id_estado_incidente=id_estado_incidente   "
            + "where usuario_id = ? "
            + "and estado!=\"Terminado\" order by incidente_id desc";
    public static final String SQL_SELECT_ALL =
            "select * from usuario_incidente";
    
    public static final String SQL_SELECT_NO_ASIGNADOS =
            "Select * from USUARIO_INCIDENTE "
            + "JOIN INCIDENTE on id_incidente=incidente_id "
            + "join SECTOR on SECTOR_id_sector=id_sector "
            + "WHERE id_sector=? "
            + "and incidente_id not in "
            + "( "
            + "select incidente_id from `USUARIO_INCIDENTE` "
            + "JOIN USUARIO ON `usuario_id`=id "
            + "join CAT_TIPO_USUARIO on CAT_TIPO_USUARIO_id_tipo=id_tipo "
            + "JOIN SECTOR ON SECTOR_id_sector=id_sector "
            + "where CAT_TIPO_USUARIO.nombre='Despachador' "
            + "and id_sector=? "
            + ")";

    
    public void createUusarioIncidente(UsuarioIncidente a, Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_INSERT);
            ps.setInt(1, a.getUsuarioId());
            ps.setInt(2, a.getIncidenteId() );
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public List loadUsuariosIncidentes(Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT_ALL);
            rs = ps.executeQuery();
            List resultados = getResults(rs);
            if (resultados.size() > 0) {
                return resultados;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public List loadNoAsignados(Connection conn, int sector)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT_NO_ASIGNADOS);
            ps.setInt(1, sector);
            ps.setInt(2, sector);
            rs = ps.executeQuery();
            List resultados = getResults(rs);
            if (resultados.size() > 0) {
                return resultados;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public List loadUsuarioIncidente(UsuarioIncidente a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT);
            ps.setInt(1, a.getUsuarioId());
            rs = ps.executeQuery();
            List resultados = getResults(rs);
            if (resultados.size() > 0) {
                return resultados;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    private List getResults(ResultSet rs)
            throws SQLException {
        List results = new ArrayList();
        while (rs.next()) {
            UsuarioIncidente a = new UsuarioIncidente();
            a.setIncidenteId(rs.getInt("incidente_id"));
            a.setUsuarioId(rs.getInt("usuario_id"));
            results.add(a);
        }
        return results;
    }
    
    private void cerrar(Connection cnn) {
        if (cnn != null) {
            try {
                cnn.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }

    private void cerrar(PreparedStatement ps) {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }

    private void cerrar(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }
}
